// JavaScript Document
/* PROJECT : AplayMap TAG
*	@require MyClass.js
*	@require MyAjax.js
*	@require MyUtils.js
*	@require MySortArray.js
*	@require jshashtable.js
*	@require minimenu.js
*	@autor: Mauricio Sanchez
*	@create: 19-08-2009
*	Clase que implementa una libreta de contactos (se abre en un popup)
*/

//.
ContactosLIB = new MyClass({
	CLASS_NAME: "ContactosLIB",

	/**
     * Property: _contactosHash
	 *	 HashTable con todos los contactos del usuario (accesible por ID del contacto).
     * {Hashtable}
     */
	 _contactosHash: null,

	 /**
     * Property: _cuenta
	 *	 Array asociativo con datos relevantes de la cuenta, utilizado para el tab Plus.
     * {Array - object tipo 'cuenta'}
     */
	 _cuenta: null,

	 /**
     * Property: busyImg
     * {DOMELEMENT -> IMG}
     */
	 busyImg: null,//REFERENCIA A LA IMAGEN DE ACTIVIDAD (CARGANDO...),

	 /**
     * Property: urlServlet
	 *	 url del servidor de peticiones Ajax
     * {STRING}
     */
	 urlServlet: "unknow",

	 /**
     * Property: urlBase
	 * 	 Url base del sitio donde se encuentran los archivos js
     * {String}
     */
	 urlBase: '',

	 /**
     * Property: editMode
	 * 	 Seteado en 'true' si la libreta de direcciones puede editar los contactos
     * {Boolean}
     */
	 editMode: false,

	 /**
     * Property: width
	 * 	 Ancho de la libreta de contactos
     * {String}
     */
	 width: '520px',

	 /**
     * Property: height
	 * 	 Altura de la libreta de contactos
     * {String}
     */
	 height: '280px',

	 /**
     * Propertyes: Parametros para carga de contactos via AJAX
     * {String}
     */
	 cuenta: '',
	 objetivo: '',

	 /**
     * Propertyes: AJAX FLAGS
	 *   Flags para sincronizar las operaciones internas via Ajax.
     * {Integer} - values : 0|1
     */
	 _flagCargar: 0,
	 _flagPersistir: 0,
	 _flagEliminar: 0,
	 _flagPersistirInfoCta: 0,

	 /**
     * Propertyes: VARIABLES PRIVADAS INTERNAS
	 *   Definicion de variables comunes a la clase
     */
	 _orderType: "A", // {String} metodo de ordenamiento actual de la lista de contactos (A:ascendente | D:descendente)
	 _textToSearch: '', // {String} texto para realizar busquedas en la lista de contactos.
	 _container: null, //{DOMELEMENT} Div que contendra la libreta de contactos
	 _tabMenu:null, //{TabMenu} Menu con tabs de distintas opciones
	 _listaContactosTab: null, //{DOMELEMENT} div general para el tab de contactos.
	 _plusTab: null, //{DOMELEMENT} div general para el tab 'plus'.
	 _listContactosMenu: null, //{MiniMenu}
	 _listaContactos: null, //{DOMELEMENT} div general que contienen una lista de contactos.

	 _newContactoMenu: null, //{MiniMenu}
	 _newContacto: null, //{DOMELEMENT} div general que contienen un formulario para crear un contacto.

	 _plusMenu: null, //{MiniMenu}
	 _plus: null, //{DOMELEMENT} div general que contiene informacion general de la cuenta.
	 _plusMenuEdit: null, //{MiniMenu}
	 _plusEdit:null, //{DOMELEMENT} div general que contiene un formulario para modifiar la informacion general de la cuenta.


	/**
     * Method: init
     */
	init: function(opciones){
		for (var key in opciones) {
			this[key] = opciones[key];
		}
		this._contactosHash = new Hashtable();
		this._container = document.createElement('div');
		this._container.className = "ContactosLIBContent";
		with (this._container.style){
			height = this.height;
			width = this.width;
		}
	},

	/**
     * Method: getContactos
	 *	 Retorna un array con todos los contactos cargados
	 * Return:
     *   Array[contactos] - {Array}
     */
	getContactos: function(){
		return (this._contactosHash.values());
	},

	/**
     * Method: persistir
	 *	 Inserta/Modifica la informacion de un contacto
	 * Parameters:
	 *   divContacto - {DomElement} : div que contiene el formulario a grabar.
     *   [callback] - {function} : se ejecuta cuando se terminan de persistir el/los contactos.
     */
	persistir: function(divContacto, callback){
		if (this._flagPersistir==1) return;
		var me = this;
		//CARGA DE CONTACTOS
		this._flagPersistir = 1;
    	$j("#iconoMapa").removeClass().addClass("icono_mapa_activo");
		var params = { COMMAND: "PERSISTIR",
					   CUENTA: this.cuenta,
					   OBJETIVO: this.objetivo,
					   ID: myUtils.getChildById(divContacto,'inputID').value,
					   NOMYAPEL: myUtils.getChildById(divContacto,'inputNYA').value,
					   DIRECCION: myUtils.getChildById(divContacto,'inputDIR').value,
					   TIPODOC: myUtils.getChildById(divContacto,'selectDOC').value,
					   NRODOC: myUtils.getChildById(divContacto,'inputDOC').value,
					   TELEFONO1: myUtils.getChildById(divContacto,'inputTEL1').value,
					   TELEFONO2: myUtils.getChildById(divContacto,'inputTEL2').value,
					   EMAIL: myUtils.getChildById(divContacto,'inputEMAIL').value,
					   OBSERVACIONES: myUtils.getChildById(divContacto,'textareaOBS').value
					 };
		var myAjax = new MyAjax();
		var onReady = function(req){
							 var contactosJSON = jQuery.parseJSON(req.responseText);
							 if (contactosJSON.length != 'undefined') {
								for (var X=0; X < contactosJSON.length; X++){
									me._contactosHash.put(contactosJSON[X].id.toString(),contactosJSON[X]);
								}
								 //llamo a callback en caso de exito
							 	if (callback!=null){
								  callback();
							 	}
							}
							 me._flagPersistir = 0;
							 me.busyImg.style.visibility = "hidden";
						  }
		var onError = function(req){
							me._flagPersistir = 0;
							me.busyImg.style.visibility = "hidden";
						  }
		myAjax.send(this.urlBase+this.urlServlet, params, onReady, onError);
	},

	/**
     * Method: persistirInfoCuenta
	 *	 Inserta/Modifica la informacion de una cuenta (observaciones en tab Plus)
	 * Parameters:
	 *   divCuenta - {DomElement} : div que contiene el formulario a guardar.
     *   [callback] - {function} : se ejecuta cuando se terminan de persistir los datos.
     */
	persistirInfoCuenta: function(divCuenta, callback){
		if (this._flagPersistirInfoCta==1) return;
		var me = this;
		this._flagPersistirInfoCta = 1;
    	$j("#iconoMapa").removeClass().addClass("icono_mapa_activo");
		var params = { COMMAND: "PERSISTIRINFOCUENTA",
					   CUENTA: this.cuenta,
					   OBJETIVO: this.objetivo,
					   OBSERVACIONES: myUtils.getChildById(divCuenta,'textareaCTAOBS').value
					 };
		var myAjax = new MyAjax();
		var onReady = function(req){
						    //var contactosJSON = req.responseText.parseJSON();
							var contactosJSON = jQuery.parseJSON(req.responseText);
							if ((contactosJSON!=null)&&(contactosJSON.length != 'undefined')&&(contactosJSON.length > 0)) {
								me._cuenta.observaciones = contactosJSON[0].observaciones;
								//llamo a callback en caso de exito
							 	if (callback!=null){
								   callback();
							 	}
							}
							me._flagPersistirInfoCta = 0;
							me.busyImg.style.visibility = "hidden";
						  }
		var onError = function(req){
							me._flagPersistirInfoCta = 0;
							me.busyImg.style.visibility = "hidden";
						  }
		myAjax.send(this.urlBase+this.urlServlet, params, onReady, onError);
	},

	/**
     * Method: cargar
	 *	 Carga todos los contactos en el hash
	 * Parameters:
     *   [callback] - {function} : se ejecuta cuando se terminan de cargar todos los contactos.
     */
	cargar: function(callback){
		this._contactosHash = new Hashtable();
		if (this.flagCargar==1) return;
		var me = this;
		//CARGA DE CONTACTOS
		this._flagCargar = 1;
    	$j("#iconoMapa").removeClass().addClass("icono_mapa_activo");
		var params = { COMMAND: "CARGAR",
					   CUENTA: this.cuenta,
					   OBJETIVO: this.objetivo
					 };
		var myAjax = new MyAjax();
		var onReady = function(req){
						     var contactosJSON = jQuery.parseJSON(req.responseText);
						     if(contactosJSON != null){
								 if ((contactosJSON.length != 'undefined')&&(contactosJSON.length>0)) {
								 	//cargo los datos de la cuenta
									me._cuenta = contactosJSON[0];
								    //cargo los contactos
									for (var X=0; X < contactosJSON[1].length; X++){
										me._contactosHash.put(contactosJSON[1][X].id.toString(),contactosJSON[1][X]);
									}
									//llamo a callback en caso de EXITO
								 	if (callback!=null){
									 callback();
								 	}
								 }
						     }
							 //me.refreshView();
							 me._flagCargar = 0;
							 $j("#iconoMapa").removeClass().addClass("icono_mapa");

						  }
		var onError = function(req){
							me._flagCargar = 0;
							me.busyImg.style.visibility = "hidden";
						  }
		myAjax.send(this.urlBase+this.urlServlet, params, onReady, onError);
	},

	/**
     * Method: eliminar
	 *	 Carga todos los contactos en el hash
	 * Parameters:
	 *   id - {String} : id del contacto que se desea eliminar
     *   [callback] - {function} : se ejecuta cuando se terminan de cargar todos los contactos.
     */
	eliminar: function(id, callback){
		if (this._flagEliminar==1) return;
		var me = this;
		this._flagEliminar = 1;
    	$j("#iconoMapa").removeClass().addClass("icono_mapa_activo");
		var params = { COMMAND: "ELIMINAR",
					   ID: id
					 };
		var myAjax = new MyAjax();
		var onReady = function(req){
						    var contactosJSON = jQuery.parseJSON(req.responseText);
							if ((contactosJSON.length != 'undefined')&&(contactosJSON[0] == 'OK')) {
								me._contactosHash.remove(id.toString());
								//llamo a callback en caso de exito
							 	if (callback!=null){
								   callback();
							 	}
							}
							me._flagEliminar = 0;
							me.busyImg.style.visibility = "hidden";
						  }
		var onError = function(req){
							me._flagEliminar = 0;
							me.busyImg.style.visibility = "hidden";
						  }
		myAjax.send(this.urlBase+this.urlServlet, params, onReady, onError);
	},

	/**
     * Method: getContainer
	 *	 retorna el div que contiene la libreta de direcciones
	 * Rreturn:
	 *   {DOMELEMENT} - DIV
     */
	getContainer:function(){
		return (this._container);
	},

	/**
     * Method: print
	 *	 imprime en el div cuyo ID es 'containerId'.
	 * Parameters:
	 *   [container] - {String} : Id del DIV donde se quiere imprimir la libreta de direcciones
     */
	print:function(){
		this._generateListaContactosTab();
		this._generatePlusTab();
		if (this._tabMenu == null){
			var tabMenuContainer = document.createElement('div');
			this._container.appendChild(tabMenuContainer);
			this._tabMenu = new TabMenu({
     								name: 'tabmenu',
									tabSelected:0,
     								container: tabMenuContainer,
     								height: this.height,
									width: this.width,
									className:'basictab'
	     						  });
			this._tabMenu.addTab({
							  name: 'Agenda',
							  rel: this._listaContactosTab
							});
			this._tabMenu.addTab({
							  name: 'Observaciones',
							  rel: this._plusTab
							});
		}
		this.viewListaContactos();
		this.viewPlus();
	},

	/**
     * Method: _generateListaContactosTab
	 *	 Genera el tab 'Contactos'
     */
	_generateListaContactosTab:function(){
		this._listaContactosTab = document.createElement('div');
		this._listaContactosTab.className = 'contactosListTab';
		with (this._listaContactosTab.style){
			height = parseInt(this.height)-25+'px';
			width = '100%';
		}
		this._listaContactosTab.innerHTML = "";
		this._generateListaContactosMenu();
		this._generateListaContactos();
	},

	/**
     * Method: _generatePlusTab
	 *	 Genera el tab 'Plus'
     */
	_generatePlusTab:function(){
		this._plusTab = document.createElement('div');
		this._plusTab.className = 'plusTab';
		with (this._plusTab.style){
			height = parseInt(this.height)-25+'px';
			width = '100%';
		}
		this._plusTab.innerHTML = "";
		this._generatePlus();
	},

	/**
     * Method: _generateListaContactosMenu
	 *	 Genera un MiniMenu para la lista de contactos.
     */
	_generateListaContactosMenu:function(){
		if (this._listaContactos==null){
			this._listaContactos = document.createElement('div');
			this._listaContactos.className = "MiniMenu";
			this._listaContactosTab.appendChild(this._listaContactos);
		}
		this._listaContactos.style.display = "block";
		var me = this;
		this._listaContactosMenu = new MiniMenu({
     										name: 'listaContactosMenu',
     										container: this._listaContactos,
     										height: parseInt(this.height)+'px',
											width: this.width
     									  });
		if (this.editMode){
			this._listaContactosMenu.addButton({
											classButton: 'add',
											onClickFunction: function(){ me.viewNewContacto()},
											info: 'Crear un nuevo contacto'
										 });
		}
		this._listaContactosMenu.addButton({
										classButton: 'orderZA',
										classOnClick: 'orderAZ',
										onClickFunction: function(){ me.ordenarListaContactos();},
										info: 'Ordenar los contactos alfabeticamente'
									 });
		this._listaContactosMenu.addButtonSearch({
										idInput: 'searchMovilInput',
										idCount: 'countSearchMovil',
										textValue: 'Buscar...',
										searchFunction:function(text){me.search(text);},
										cleanFunction:function(){me.cleanSearch();},
										info: 'Mostrar/ocultar barra de busqueda de contactos'
									 });
	},

	/**
     * Method: _generateListaContactos
	 *	 Genera una lista de contactos en el div representado por la property '_listaContactos'
     */
	_generateListaContactos:function(){
		var content = this._listaContactosMenu._content;
		content.innerHTML = "";
		//imprimir todos los contactos
		var contactosArray = this.getContactos();
		var sorter = new MySortArray(contactosArray,"QUICKSORT");
		sorter.ordenar(this._orderType,'nomyapel');
		var searchCount = 0;
		for(var i=0; i < contactosArray.length; i++){
			var tempDiv = this._generateDivContacto(contactosArray[i]);
			if ((this._textToSearch!='')&&(contactosArray[i].nomyapel.toUpperCase().match(this._textToSearch)!=null)){
					searchCount++;
					tempDiv.style.backgroundColor = "#FFFFCC";
				}
			content.appendChild(tempDiv);
		}
	},

	/**
     * Method: _generateDivContacto
	 *	 Genera un div con datos de un contacto recibido por parametro
	 * Return:
	 *	 {DOMELEMENT - div}
     */
	_generateDivContacto:function(contacto, contactoDOMdiv){
		var me = this;
		if (contactoDOMdiv==null){
			var contactoDIV = document.createElement('div');
			contactoDIV.className = 'contacto';
			contactoDIV.id = 'contactoDIV_'+contacto.id;
		}
		else{
			var contactoDIV = contactoDOMdiv;
		}
		contactoDIV.innerHTML = "";

		//BOTONERA
		if (this.editMode){
			var botonera = document.createElement('div');
			botonera.className = 'botonera';
			botonera.id = "botonera";
			contactoDIV.appendChild(botonera);
		    var editBTN = document.createElement('div');
			editBTN.className = 'edit';
			editBTN.title = "Editar datos del contacto";
			editBTN.onclick = function(){
									contactoMORE.style.display='block';
									me._convertToEditMode(contacto, contactoDIV);
								};
			botonera.appendChild(editBTN);
			var trashBTN = document.createElement('div');
			trashBTN.className = 'trash';
			trashBTN.onclick = function(){
									var conf = confirm('Seguro desea eliminar el contacto "'+contacto.nomyapel+'" de esta libreta?');
									if (conf){

										var callback = function(){
													me._listaContactosMenu._content.removeChild(contactoDIV);
												 };
										me.eliminar(contacto.id, callback);
									}
								};
			trashBTN.title = "Enviar este contaco a la papelera";
			botonera.appendChild(trashBTN);
		}

		var contactoMORE = document.createElement('div');
		contactoMORE.id = 'contactoMORE';
		if (contactoDOMdiv==null)
			contactoMORE.style.display='none';

		var contactoTop = document.createElement('div');
		contactoTop.className = 'top';
		contactoTop.id = 'titleTop';
		contactoTop.innerHTML = contacto.nomyapel;
		contactoTop.style.cursor = 'pointer';
		contactoTop.onclick = function(){
								if (contactoMORE.style.display=='none'){
									contactoMORE.style.display='block';
								}
								else{
									contactoMORE.style.display='none';
								}
							  };
		contactoDIV.appendChild(contactoTop);
		contactoDIV.appendChild(contactoMORE);

		//DATOS DEL CONTACTO
		var contactoDoc = document.createElement('div');
		contactoDoc.id = 'documento';
		contactoDoc.innerHTML = '<span class="label">Documento: </span>' + contacto.tipodoc + ' ' + contacto.nrodoc;
		contactoMORE.appendChild(contactoDoc);
		var contactoDir = document.createElement('div');
		contactoDir.id = 'direccion';
		contactoDir.innerHTML = '<span class="label">Direccion: </span>' + contacto.direccion;
		contactoMORE.appendChild(contactoDir);
		var contactoTel1 = document.createElement('div');
		contactoTel1.id = 'telefono1';
		contactoTel1.innerHTML = '<span class="label">Telefono (fijo): </span>' + contacto.telefono1;
		contactoMORE.appendChild(contactoTel1);
		var contactoTel2 = document.createElement('div');
		contactoTel2.id = 'telefono2';
		contactoTel2.innerHTML = '<span class="label">Telefono (movil): </span>' + contacto.telefono2;
		contactoMORE.appendChild(contactoTel2);
		var contactoEmail = document.createElement('div');
		contactoEmail.id = 'email';
		contactoEmail.innerHTML = '<span class="label">Email: </span>' + contacto.email;
		contactoMORE.appendChild(contactoEmail);
		var contactoObs = document.createElement('div');
		contactoObs.id = 'observacion';
		contactoObs.innerHTML = '<span class="label">Observaciones: </span>' + contacto.observaciones;
		contactoMORE.appendChild(contactoObs);

		return contactoDIV;
	},

	/**
     * Method: _convertToEditMode
	 *	 Convierte un div con datos de un contacto en modo editable.
	 * Return:
	 *	 {DOMELEMENT - div}
     */
	_convertToEditMode:function(contacto, contactoDIV){
		var me = this;

		var contactoTOP = myUtils.getChildById(contactoDIV,'titleTop');
		contactoTOP.onclick = "";
		contactoTOP.style.cursor = 'default';

		var contactoMORE = myUtils.getChildById(contactoDIV,'contactoMORE');
		contactoMORE.innerHTML = this._generateHTMLFormContacto(contacto);

		//BOTONERA
		var botonera = myUtils.getChildById(contactoDIV,'botonera');
		botonera.innerHTML = "";
	    var saveBTN = document.createElement('div');
		saveBTN.className = 'save';
		saveBTN.title = "Guardar datos del contacto";
		saveBTN.onclick = function(){
								var callback = function(){
													var contactoUPD = me._contactosHash.get(contacto.id.toString());
													me._generateDivContacto(contactoUPD, contactoDIV);
												}
								me.persistir(contactoDIV, callback);
							};
		botonera.appendChild(saveBTN);
		var cancelBTN = document.createElement('div');
		cancelBTN.className = 'cancel';
		cancelBTN.title = "Salir del modo de edicion";
		cancelBTN.onclick = function(){
								me._generateDivContacto(contacto, contactoDIV);
							};
		botonera.appendChild(cancelBTN);
	},

	/**
     * Method: _validateNewContactoForm
	 *	 Valida los campos de generacion de un contacto, retorna true o false en caso de error y dispara un "Alert" con los mensajes de error.
     */
	_validateNewContacto:function(){
		var msg="";
		var V = new MyValidator();
		var nomyapel = myUtils.getChildById(this._newContacto,'inputNYA').value;
	    var direccion = myUtils.getChildById(this._newContacto,'inputDIR').value;
		var nrodoc = myUtils.getChildById(this._newContacto,'inputDOC').value;
		var telefono1 = myUtils.getChildById(this._newContacto,'inputTEL1').value;
		var telefono2 =	myUtils.getChildById(this._newContacto,'inputTEL2').value;
		var email = myUtils.getChildById(this._newContacto,'inputEMAIL').value;
		var observaciones = myUtils.getChildById(this._newContacto,'textareaOBS').value;
		if (V.trim(nomyapel)=="")
			msg += "El campo 'Nombre y apellido' es obligatorio.\n";
		else
			if (!V.isTextoSinCaracteresEspeciales(nomyapel))
				msg += "El campo 'Nombre y apellido' contiene caracteres no validos.\n";
		if ((V.trim(direccion)!="")&&(!V.isTextoSinCaracteresEspeciales(direccion)))
			msg += "El campo 'Direccion' contiene caracteres no validos.\n";
		if ((V.trim(nrodoc)!="")&&(!V.isDigits(nrodoc)))
			msg += "El campo 'Numero de documento' contiene caracteres no validos.\n";
		if ((V.trim(telefono1)!="")&&(!V.isTextoSinCaracteresEspeciales(telefono1)))
			msg += "El campo 'Telefono' contiene caracteres no validos.\n";
		if ((V.trim(telefono2)!="")&&(!V.isTextoSinCaracteresEspeciales(telefono2)))
			msg += "El campo 'Celular' contiene caracteres no validos.\n";
		if ((V.trim(email)!="")&&(!V.isMail(email)))
			msg += "El campo 'Email' no presenta una direccion de correo valida.\n";
		if ((V.trim(observaciones)!="")&&(!V.isTextoSinCaracteresEspeciales(observaciones)))
			msg += "El campo 'Observaciones' contiene caracteres no validos.\n";

		if (msg!=""){
			alert(msg);
			return false;
		}
		return true;
	},

	/**
     * Method: _generateNewContactoMenu
	 *	 Genera un minimenu para crear un nuevo contacto
     */
	_generateNewContactoMenu:function(){
		if (this._newContacto==null){
			this._newContacto = document.createElement('div');
			this._newContacto.className = "MiniMenu";
			this._listaContactosTab.appendChild(this._newContacto);
		}
		this._newContacto.style.display="block";
		var me=this;
		this._newContactoMenu = new MiniMenu({
     										name: 'newContactoMenu',
     										container: this._newContacto,
     										height: parseInt(this.height)+'px',
											width: this.width
     									  });
		this._newContactoMenu.addButton({
										classButton: 'back',
										onClickFunction: function(){ me.viewListaContactos()},
										info: 'Volver a la lista de contactos'
									 });
		this._newContactoMenu.addButton({
										classButton: 'save',
										onClickFunction: function(){
															if (me._validateNewContacto()){
																var callback = function(){
																			  me._generateListaContactos();
																			  me.viewListaContactos();
																  		   }
																me.persistir(me._newContacto, callback);
															}
														 },
										info: 'Guardar'
									 });
	},

	/**
     * Method: _generateListaContactos
	 *	 Genera un formulario de contactos representado por la property '_newContacto'
     */
	_generateNewContacto:function(){
		if (this._newContactoMenu==null){
			this._generateNewContactoMenu();
		}
		var content = this._newContactoMenu._content;
		//generar ABM de nuevo contacto.
		content.innerHTML = this._generateHTMLFormContacto(null);
	},

	/**
     * Method: viewNewContacto
	 *	 Muestra el menu de creacion de contacto
     */
	viewNewContacto: function(){
		this._generateNewContacto();
		this._newContacto.style.display="block";
		this._listaContactos.style.display="none";
	},

	/**
     * Method: viewListaContactos
	 *	 Muestra el menu de lista de contactos
     */
	viewListaContactos: function(){
		if (this._newContacto != null)
			this._newContacto.style.display="none";
		this._listaContactos.style.display="block";
	},

	/**
     * Method: _generateHTMLFormContacto
	 * Return:
	 *	  {String} - HTML
     */
	_generateHTMLFormContacto: function(contacto){
		var table = ((contacto!=null)?'':'<div class="contacto" style="border-bottom: none"><br/>');
		table += '<input id="inputID" type="hidden" value="'+((contacto!=null)?contacto.id:'')+'"/>';
		table += '<table cellpadding="0" cellspacing="'+((contacto!=null)?'0':'2')+'" border="0">';
		table += '	  <tr>';
		table += '    	<td valign="middle"><span class="label">Nombre y apellido: </span></td>';
		table += '        <td><input id="inputNYA" type="text" size="30" value="'+((contacto!=null)?contacto.nomyapel:'')+'"/></td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="middle"><span class="label">Documento: </span></td>';
		table += '      <td>';
		table += '        <select id="selectDOC">';
		table += '            	<option value="DNI" '+((contacto!=null)?((contacto.tipodoc=='DNI')?'selected="selected"':''):'')+'>DNI</option>';
		table += '              <option value="LC" '+((contacto!=null)?((contacto.tipodoc=='LC')?'selected="selected"':''):'')+'>LC</option>';
		table += '              <option value="LE" '+((contacto!=null)?((contacto.tipodoc=='LE')?'selected="selected"':''):'')+'>LE</option>';
		table += '        </select>';
		table += '        <input type="text" id="inputDOC" size="18" style="margin-left:2px;" value="'+((contacto!=null)?contacto.nrodoc:'')+'"/>';
		table += '      </td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="middle"><span class="label">Direccion: </span></td>';
		table += '      <td><input id="inputDIR" type="text" size="30" value="'+((contacto!=null)?contacto.direccion:'')+'"/></td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="middle"><span class="label">Telefono (fijo): </span></td>';
		table += '      <td><input id="inputTEL1" type="text" size="30" value="'+((contacto!=null)?contacto.telefono1:'')+'"/></td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="middle"><span class="label">Telefono (movil): </span></td>';
		table += '      <td><input id="inputTEL2" type="text" size="30" value="'+((contacto!=null)?contacto.telefono2:'')+'"/></td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="middle"><span class="label">Email: </span></td>';
		table += '      <td><input type="text" id="inputEMAIL" size="30" value="'+((contacto!=null)?contacto.email:'')+'"/></td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="top"><span class="label" >Observaciones: </span></td>';
		table += '      <td><textarea id="textareaOBS" cols="50" rows="2">'+((contacto!=null)?contacto.observaciones:'')+'</textarea></td>';
		table += '    </tr>';
		table += '</table>';
		table += ((contacto!=null)?'':'</div>');
		return table;
	},

	/**
     * Method: ordenarListaContactos
	 *	 Ordena alfabeticamente Descendiente/Ascendiente la lista de contactos.
     */
	ordenarListaContactos: function(){
		if (this._orderType=="A"){
			this._orderType="D";
		}
		else{
			this._orderType="A";
		}
		this._generateListaContactos();
	},

	/**
     * Method: search
	 *	 Busca y resalta un contacto en la lista de contactos.
	 * Params:
	 *   texto - {String} : texto a buscar.
     */
	search: function(texto){
    	if ((texto.length > 0)&&(texto!="Buscar...")){
			this._textToSearch = texto.toUpperCase();
			this._generateListaContactos();
		}
	},

	/**
     * Method: cleanSearch
	 *	 Limpia una busqueda realizada con anticipacion.
     */
	cleanSearch: function(){
    	if (this._textToSearch!=''){
			this._textToSearch = '';
			this._generateListaContactos();
		}
	},

	/**
     * Method: _generatePlusMenu
	 *	 Genera un MiniMenu para las observaciones de la Flota/Movil.
     */
	_generatePlusMenu:function(){
		if (this._plus==null){
			this._plus = document.createElement('div');
			this._plus.className = "MiniMenu";
			this._plusTab.appendChild(this._plus);
		}
		this._plus.style.display = "block";
		var me = this;
		this._plusMenu = new MiniMenu({
     										name: 'plusMenu',
     										container: this._plus,
     										height: parseInt(this.height)+'px',
											width: this.width
     									  });
		if (this.editMode){
			this._plusMenu.addButton({
											classButton: 'edit',
											onClickFunction: function(){ me.viewPlusEdit();	},
											info: 'Modificar observaciones'
									 });
		}
	},

	/**
     * Method: _validatePlus
	 *	 Valida los campos de la seccion 'Plus', retorna true o false en caso de error y dispara un "Alert" con los mensajes de error.
     */
	_validatePlus:function(){
		var msg="";
		var V = new MyValidator();
		var observaciones = myUtils.getChildById(this._plusEdit,'textareaCTAOBS').value;

		if ((V.trim(observaciones)!="")&&(!V.isTextoSinCaracteresEspeciales(observaciones)))
			msg += "El campo 'Observaciones' contiene caracteres no validos.\n";

		if (msg!=""){
			alert(msg);
			return false;
		}
		return true;
	},

	/**
     * Method: _generatePlusMenuEdit
	 *	 Genera un MiniMenu para las observaciones de la Flota/Movil en modo edicion.
     */
	_generatePlusMenuEdit:function(){
		if (this._plusEdit==null){
			this._plusEdit = document.createElement('div');
			this._plusEdit.className = "MiniMenu";
			this._plusTab.appendChild(this._plusEdit);
		}
		this._plusEdit.style.display = "block";
		var me = this;
		this._plusMenuEdit = new MiniMenu({
     										name: 'plusEditMenu',
     										container: this._plusEdit,
     										height: parseInt(this.height)+'px',
											width: this.width
     									  });
		this._plusMenuEdit.addButton({
										classButton: 'cancel',
										onClickFunction: function(){ me.viewPlus();	},
										info: 'Salir del modo edicion (cancelar)'
								 });
		this._plusMenuEdit.addButton({
										classButton: 'save',
										onClickFunction: function(){
																	if (me._validatePlus()){
																		var callback = function(){
																			me._generatePlus();
																			me.viewPlus();
																		}
																		me.persistirInfoCuenta(me._plusEdit, callback);
																	}
																},
										info: 'Guardar cambios'
								 });
	},

	/**
     * Method: viewNewContacto
	 *	 Muestra el menu de creacion de contacto
     */
	viewPlus: function(){
		if (this._plus!=null)
			this._plus.style.display="block";
		if (this._plusEdit!=null)
			this._plusEdit.style.display="none";
	},

	/**
     * Method: viewListaContactos
	 *	 Muestra el menu de lista de contactos
     */
	viewPlusEdit: function(){
		this._generatePlusEdit();
		this._plus.style.display="none";
		this._plusEdit.style.display="block";
	},

	/**
     * Method: _generatePlus
	 *	 Genera un formulario de observaciones para la seccion plus
     */
	_generatePlus:function(){
		if (this._plusMenu==null){
			this._generatePlusMenu();
		}
		var content = this._plusMenu._content;
		//generar ABM de observaciones plus.
		content.innerHTML = this._generateHTMLFormPlus(false);
	},

	/**
     * Method: _generatePlusEdit
	 *	 Genera un formulario de observaciones para la seccion plus	en modo edicion
     */
	_generatePlusEdit:function(){
		if (this._plusMenuEdit==null){
			this._generatePlusMenuEdit();
		}
		var content = this._plusMenuEdit._content;
		//generar ABM de observaciones plus.
		content.innerHTML = this._generateHTMLFormPlus(true);
	},

	/**
     * Method: _generateHTMLFormPlus
	 * Return:
	 *	  {String} - HTML
	 * Params:
	 *	 mode - {boolean} : indica si es modo lectura o modo edicion.
     */
	_generateHTMLFormPlus: function(mode){
		var table = '<div class="contacto" style="border-bottom: none"><br/>';
		table += '<table cellpadding="0" cellspacing="2" border="0">';
		table += '	  <tr>';
		table += '    	<td valign="middle"><span class="label">Cuenta: </span></td>';
		table += '      <td>'+this._cuenta.label+'</td>';
		table += '    </tr>';
		table += '    <tr>';
		table += '    	<td valign="top"><span class="label" >Observaciones: </span></td>';
		if (mode)
			table += '<td><textarea id="textareaCTAOBS" cols="50" rows="3">'+this._cuenta.observaciones+'</textarea></td>';
		else
			table += '<td>'+this._cuenta.observaciones+'</td>';
		table += '    </tr>';
		table += '</table>';
		table += '</div>';
		return table;
	}

});